package com.atguigu.test03;

import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/**
 * @author haoranlu
 * @project IntelliJ IDEA
 * 事务：
 *
 *
 * 需求:
 *      删除某个订单
 *  (1)删除订单表的记录
 *  (2)删除订单明细表的记录
 *
 *  如果我们在订单明细表建立外键时，指定on delete cascade，那么在删除订单时，会自动把对应的订单明细表的记录删除
 *  如果没有建立外键或建立外键时没有指定外键，那么在删除订单时，不会自动对应订单明细表的记录，那么就需要程序员编写对应的sql语句去删除订单明细表
 *
 *  假如，你现在要删除"15275760194821"的订单
 *  如何处理事务？
 *  (1)在获取完连接后，在使用连接来创建PreparedStatement对象之前，要设置当前连接为手动提交事务
 *  commit.setAutoCommit(false)
 *  (2)在执行成功时，应该提交conn.commit();
 *      在执行失败或者异常时，应该回滚conn.rollback();
 *
 *  (3)在关闭连接之前，把手动提交模式修改重新修改为自动提交模式
 *  因为在后面获取的数据基本是从数据库连接池中获取连接，这种连接是‘重复’使用的，那么如果你把它修改为‘手动’提交了
 *  然后没有还原，当你把这个连接还给数据库连接池时，这个连接可能会被其他人拿到，它可能以为是自动提交的，操作为sql
 *  语句以后没有commit,结果是没有提交的
 */

public class TransactionTest {
    @Test
    public void test02() throws Exception{

        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/day04_test01_bookstore";
        Connection conn = DriverManager.getConnection(url,"root","123456");

        String sql ="delete from orders where id = ?";


        PreparedStatement pst = conn.prepareStatement(sql);
        pst.setString(1,"15275760194821");

        int len = pst.executeUpdate();
        System.out.println(len>0?"删除成功":"删除失败");
        pst.close();
        conn.close();
    }
    //这里没有建立外键的情况下
    @Test
    public void test01() throws Exception{

        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/day04_test01_bookstore";
        Connection conn = DriverManager.getConnection(url,"root","123456");
        conn.setAutoCommit(false);

        String sql1 ="delete from orders where id = ?";
        String sql2 ="delete from order_items where order_id = ?";

        PreparedStatement pst1 = conn.prepareStatement(sql1);
        pst1.setString(1,"15275760194821");

        PreparedStatement pst2 = conn.prepareStatement(sql2);
        pst2.setString(1,"15275760194821");

        boolean flag = true;
        try {
            int len1 = pst1.executeUpdate();
            if (!(len1>0)){
                flag=false;
            }
            if (flag){
                int len2 = pst2.executeUpdate();
                if(!(len2>0)){
                    flag=false;
                }
            }
            if(flag){
                System.out.println("成功了");
                conn.commit();
            }else{
                System.out.println("失败了");
                conn.rollback();
            }
        }catch (Exception e){
            System.out.print("出现异常");
            conn.rollback();
        }
        pst1.close();
        pst2.close();
        conn.setAutoCommit(true);
        conn.close();
    }
}
